{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Vectorozied Backtester"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>close</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>datetime</th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>11/30/18 21:00</th>\n",
       "      <td>3241</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11/30/18 21:01</th>\n",
       "      <td>3244</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11/30/18 21:02</th>\n",
       "      <td>3241</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11/30/18 21:03</th>\n",
       "      <td>3243</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11/30/18 21:04</th>\n",
       "      <td>3243</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12/7/18 14:55</th>\n",
       "      <td>3408</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12/7/18 14:56</th>\n",
       "      <td>3409</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12/7/18 14:57</th>\n",
       "      <td>3411</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12/7/18 14:58</th>\n",
       "      <td>3406</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12/7/18 14:59</th>\n",
       "      <td>3396</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>1035 rows × 1 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                close\n",
       "datetime             \n",
       "11/30/18 21:00   3241\n",
       "11/30/18 21:01   3244\n",
       "11/30/18 21:02   3241\n",
       "11/30/18 21:03   3243\n",
       "11/30/18 21:04   3243\n",
       "...               ...\n",
       "12/7/18 14:55    3408\n",
       "12/7/18 14:56    3409\n",
       "12/7/18 14:57    3411\n",
       "12/7/18 14:58    3406\n",
       "12/7/18 14:59    3396\n",
       "\n",
       "[1035 rows x 1 columns]"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.read_csv('data/rb.csv').set_index('datetime')\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "initial_capital = 1e4\n",
    "# Calculate moving average\n",
    "df['MA5'] = 0\n",
    "df['MA20'] = 0\n",
    "# Generate position by comparing MA5 and MA20\n",
    "df['Position'] = 0\n",
    "# Calculate Trade and Position P&L\n",
    "df['TradeP&L'] = 0\n",
    "df['PositionP&L'] = 0\n",
    "df['CumP&L'] = 0\n",
    "df['Capital'] = 0\n",
    "# Calculate returns \n",
    "df['Return'] = 0\n",
    "# Method1: calculate NAV by multiplication of returns\n",
    "df['NetAssetValue'] = 0\n",
    "# Method2: calculate NAV by divide by initial capital\n",
    "df['NetAssetValue2'] = 0\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>close</th>\n",
       "      <th>MA5</th>\n",
       "      <th>MA20</th>\n",
       "      <th>Position</th>\n",
       "      <th>TradeP&amp;L</th>\n",
       "      <th>PositionP&amp;L</th>\n",
       "      <th>CumP&amp;L</th>\n",
       "      <th>Capital</th>\n",
       "      <th>Return</th>\n",
       "      <th>NetAssetValue</th>\n",
       "      <th>NetAssetValue2</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>datetime</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>11/30/18 21:00</th>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11/30/18 21:01</th>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11/30/18 21:02</th>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11/30/18 21:03</th>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11/30/18 21:04</th>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12/7/18 14:55</th>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12/7/18 14:56</th>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12/7/18 14:57</th>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12/7/18 14:58</th>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12/7/18 14:59</th>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>1035 rows × 11 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                close    MA5   MA20  Position  TradeP&L  PositionP&L  CumP&L  \\\n",
       "datetime                                                                       \n",
       "11/30/18 21:00   True  False  False      True      True         True    True   \n",
       "11/30/18 21:01   True  False  False      True      True         True    True   \n",
       "11/30/18 21:02   True  False  False      True      True         True    True   \n",
       "11/30/18 21:03   True  False  False      True      True         True    True   \n",
       "11/30/18 21:04   True  False  False      True      True         True    True   \n",
       "...               ...    ...    ...       ...       ...          ...     ...   \n",
       "12/7/18 14:55    True  False  False     False      True        False   False   \n",
       "12/7/18 14:56    True  False  False     False      True        False   False   \n",
       "12/7/18 14:57    True  False  False     False      True        False   False   \n",
       "12/7/18 14:58    True  False  False     False      True        False   False   \n",
       "12/7/18 14:59    True  False  False     False      True        False   False   \n",
       "\n",
       "                Capital  Return  NetAssetValue  NetAssetValue2  \n",
       "datetime                                                        \n",
       "11/30/18 21:00    False    True          False           False  \n",
       "11/30/18 21:01    False    True          False           False  \n",
       "11/30/18 21:02    False    True          False           False  \n",
       "11/30/18 21:03    False    True          False           False  \n",
       "11/30/18 21:04    False    True          False           False  \n",
       "...                 ...     ...            ...             ...  \n",
       "12/7/18 14:55     False   False          False           False  \n",
       "12/7/18 14:56     False   False          False           False  \n",
       "12/7/18 14:57     False   False          False           False  \n",
       "12/7/18 14:58     False   False          False           False  \n",
       "12/7/18 14:59     False   False          False           False  \n",
       "\n",
       "[1035 rows x 11 columns]"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df2 = pd.read_csv('data/NaiveExcelBacktester.csv').set_index('datetime').drop(columns=['MA5 >= MA20'])\n",
    "df == df2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "class DataHandler:\n",
    "    def __init__(self, start_date, end_date, symbol, contract):\n",
    "        self.start_date = start_date\n",
    "        self.end_date = end_date\n",
    "        self.symbol = symbol\n",
    "        self.contract = contract\n",
    "\n",
    "    def load(self):\n",
    "        \"\"\"Load data\n",
    "        Multiple csv file, append them\n",
    "        \"\"\"\n",
    "        return df\n",
    "        "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "class BackTest:\n",
    "    __metaclass__ = ABCMeta\n",
    "\n",
    "    def __init__(self, symbol, data=None):\n",
    "        self.data = data.copy()  # use copy method to reduce times of loading data file\n",
    "        self.df = pd.DataFrame(index=data.index, columns=['close', 'signal', 'position'])\n",
    "        self.symbol = symbol\n",
    "        self.df.close = self.data.close\n",
    "\n",
    "    @abstractmethod\n",
    "    def generate_signal(self):\n",
    "        raise NotImplementedError('Should implement generate signal method!')\n",
    "\n",
    "    def get_commission_rate(self):\n",
    "        return 0.0001\n",
    "\n",
    "    def get_multiplier(self):\n",
    "        multiplier_dict = {'rb': 10}\n",
    "        return multiplier_dict[self.symbol]\n",
    "\n",
    "    def generate_position(self):\n",
    "        self.df.loc[self.df.signal >= 0, 'position'] = 1\n",
    "        self.df.loc[self.df.signal < 0, 'position'] = -1\n",
    "#         self.df.loc[self.df.signal == 0, 'position'] = 0\n",
    "\n",
    "    def calculate_performance(self):\n",
    "        self.generate_position()  # default 0 -1 1 can be set in other format\n",
    "\n",
    "        commission_rate = self.get_commission_rate()\n",
    "        multiplier = self.get_multiplier()\n",
    "\n",
    "        self.df.position = self.df.position.shift().fillna(0)  # shift position\n",
    "        self.df['trade'] = (self.df.position - self.df.position.shift()).fillna(0)\n",
    "\n",
    "        # limit up and down happends if and only if ask==bid\n",
    "        # tag as bad bar if it happens at bar open or close\n",
    "        good_bar = (self.data.open_bid_price1 < self.data.open_ask_price1) & (\n",
    "                    self.data.close_bid_price1 < self.data.close_ask_price1)\n",
    "        good_buy = (self.df.trade > 0) & good_bar\n",
    "        good_sell = (self.df.trade < 0) & good_bar\n",
    "        bad_buy_or_sell = (self.df.trade != 0) & ((self.data.close_bid_price1 == self.data.close_ask_price1) | (\n",
    "            self.data.open_bid_price1 == self.data.open_ask_price1))\n",
    "\n",
    "        self.df.loc[bad_buy_or_sell, 'tradeprice'] = self.data.loc[bad_buy_or_sell, 'close']\n",
    "        self.df.loc[good_buy, 'tradeprice'] = self.data.loc[good_buy, 'open_ask_price1']\n",
    "        self.df.loc[good_sell, 'tradeprice'] = self.data.loc[good_sell, 'open_bid_price1']\n",
    "\n",
    "        self.df['tradepnl'] = \n",
    "        self.df['pospnl'] = \n",
    "        self.df['barpnl'] = self.df.pospnl + self.df.tradepnl\n",
    "        self.df['cumpnl'] = self.df.barpnl.cumsum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "class NaiveMA(BackTest):\n",
    "    def __init__(self, symbol, data):\n",
    "        super(NaiveMA, self).__init__(symbol, data)\n",
    "    \n",
    "    def generate_signal(self):\n",
    "        \"\"\" Your code here\n",
    "        \"\"\"\n",
    "        "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "data_handler = DataHandler(...)\n",
    "data = data_handler.load()\n",
    "moving_average_test = NaiveMA(.., ..)\n",
    "moving_average_test.calculate_performance()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x118b01410>]"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(100*np.random.rand(100))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Event-Driven BackTester"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [],
   "source": [
    "import queue\n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [],
   "source": [
    "number_queue = queue.Queue()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([6, 2, 4, 3, 4])"
      ]
     },
     "execution_count": 78,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "random_nums = np.random.randint(1,10,5)\n",
    "random_nums"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "6 1\n",
      "2 2\n",
      "4 3\n",
      "3 4\n",
      "4 5\n"
     ]
    }
   ],
   "source": [
    "for num in random_nums:\n",
    "    number_queue.put(num)\n",
    "    print(num, number_queue.qsize())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "6 4\n",
      "2 3\n",
      "4 2\n",
      "3 1\n",
      "4 0\n"
     ]
    }
   ],
   "source": [
    "for _ in range(number_queue.qsize()):\n",
    "    print(number_queue.get(), number_queue.qsize())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
